From cc324a58e1599668be563a5e41998ab759d3755a Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 20 Jun 2007 19:24:08 +0100 Subject: [PATCH] Add hypercall function for retrieving EDID info Signed-off-by: Jan Beulich Signed-off-by: Keir Fraser --- xen/arch/x86/platform_hypercall.c | 24 ++++++++++++++++++++++++ xen/include/public/platform.h | 12 ++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c index 79376bb2a4..33dd905d07 100644 --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -24,6 +24,9 @@ #include #include "cpu/mtrr/mtrr.h" +extern uint16_t boot_edid_caps; +extern uint8_t boot_edid_info[]; + #ifndef COMPAT typedef long ret_t; DEFINE_SPINLOCK(xenpf_lock); @@ -217,6 +220,27 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op) ? -EFAULT : 0); break; } + case XEN_FW_VBEDDC_INFO: + ret = -ESRCH; + if ( op->u.firmware_info.index != 0 ) + break; + if ( *(u32 *)bootsym(boot_edid_info) == 0x13131313 ) + break; + + op->u.firmware_info.u.ddc_info.capabilities = + bootsym(boot_edid_caps); + op->u.firmware_info.u.ddc_info.edid_transfer_time = + bootsym(boot_edid_caps) >> 8; + + ret = 0; + if ( copy_field_to_guest(u_xenpf_op, op, u.firmware_info. + u.ddc_info.capabilities) || + copy_field_to_guest(u_xenpf_op, op, u.firmware_info. + u.ddc_info.edid_transfer_time) || + copy_to_compat(op->u.firmware_info.u.ddc_info.edid, + bootsym(boot_edid_info), 128) ) + ret = -EFAULT; + break; default: ret = -EINVAL; break; diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h index 50e3b5149c..2b2a595c77 100644 --- a/xen/include/public/platform.h +++ b/xen/include/public/platform.h @@ -115,8 +115,9 @@ typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); #define XENPF_firmware_info 50 -#define XEN_FW_DISK_INFO 1 -#define XEN_FW_DISK_MBR_SIGNATURE 2 +#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ +#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ +#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ struct xenpf_firmware_info { /* IN variables. */ uint32_t type; @@ -140,6 +141,13 @@ struct xenpf_firmware_info { uint8_t device; /* bios device number */ uint32_t mbr_signature; /* offset 0x1b8 in mbr */ } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ + struct { + /* Int10, AX=4F15: Get EDID info. */ + uint8_t capabilities; + uint8_t edid_transfer_time; + /* must refer to 128-byte buffer */ + XEN_GUEST_HANDLE(uint8_t) edid; + } ddc_info; /* XEN_FW_VBEDDC_INFO */ } u; }; typedef struct xenpf_firmware_info xenpf_firmware_info_t; -- 2.30.2